package com.ldn.server.queue.covert;

import com.ldn.common.basic.dispose.bo.MqttRocketmqBo;
import com.ldn.common.basic.enums.mqtt.MMessageTypeEnums;
import org.springframework.scheduling.annotation.Async;

/**
 * @author 李大牛家的牛 (scafel@163.com)
 * @product serverless
 * @className MqttBasicCovert
 * @createDate 2025/3/7 - 13:24
 * @description ToDo...
 **/
public interface MqttBasicCovert {

    /**
     * 转换消息
     * <p>
     *     1. 读取MqttRocketmqBo消息体
     *     2. 根据消息体中的messageType进行消息处理
     *     3. 根据消息体中的topic进行消息分类
     *     4. 根据消息体中的clientCode进行用户分类
     *     5. 检查消息体中是否包含指令块
     *     6. 根据指令块进行指令处理
     *     7. 检查消息体中是否需要执行钩子函数并执行钩子函数
     * </p>
     *
     * @param payload 消息体
     */
    @Async
    default void transformPayload(MqttRocketmqBo payload) {
        int messageType = payload.getMessageType();
        MMessageTypeEnums typeEnums = MMessageTypeEnums.getType(messageType);
        switch (typeEnums) {
            case MESSAGE:
                this.messageHandler(payload);
                break;
            case ONLINE:
                this.onlineHandler(payload);
                break;
            case OFFLINE:
                this.offlineHandler(payload);
                break;
            case AUTHENTICATE:
                this.authenticateHandler(payload);
                break;
            case SUBSCRIBE:
                this.subscribeHandler(payload);
                break;
            case UNSUBSCRIBE:
                this.unsubscribeHandler(payload);
                break;
            case PUBLISH_VALID:
                this.publishValidHandler(payload);
                break;
            case SUBSCRIBE_VALID:
                this.subscribeValidHandler(payload);
                break;
            default:
                break;
        }
    }
    /**
     * 订阅验证消息处理
     *  <p>
     *      1. 获取消息体中的clientCode 提供用户或设备的编码
     *      2. 发送订阅成功或失败信息等操作
     *  </p>
     * @param payload 消息体
     */
    void subscribeValidHandler(MqttRocketmqBo payload);
    /**
     * 发布验证消息处理
     *  <p>
     *      1. 获取消息体中的clientCode 提供用户或设备的编码
     *      2. 发送发布成功或失败信息等操作
     *  </p>
     * @param payload 消息体
     */
    void publishValidHandler(MqttRocketmqBo payload);
    /**
     * 取消订阅消息处理
     *  <p>
     *      1. 获取消息体中的clientCode 提供用户或设备的编码
     *      2. 发送取消订阅成功或失败信息等操作
     *  </p>
     * @param payload 消息体
     */
    void unsubscribeHandler(MqttRocketmqBo payload);
    /**
     * 订阅消息处理
     *  <p>
     *      1. 获取消息体中的clientCode 提供用户或设备的编码
     *      2. 发送订阅成功或失败信息等操作
     *  </p>
     * @param payload 消息体
     */
    void subscribeHandler(MqttRocketmqBo payload);
    /**
     * 认证消息处理
     *  <p>
     *      1. 获取消息体中的clientCode 提供用户或设备的编码
     *      2. 发送认证成功或失败信息等操作
     *  </p>
     * @param payload 消息体
     */
    void authenticateHandler(MqttRocketmqBo payload);
    /**
     * 下线消息处理
     *  <p>
     *      1. 获取消息体中的clientCode 提供用户或设备的编码
     *      2. 发送下线成功或失败信息等操作
     *  </p>
     * @param payload 消息体
     */
    void offlineHandler(MqttRocketmqBo payload);
    /**
     * 上线消息处理
     *  <p>
     *      1. 获取消息体中的clientCode 提供用户或设备的编码
     *      2. 发送上线成功或失败信息等操作
     *  </p>
     * @param payload 消息体
     */
    void onlineHandler(MqttRocketmqBo payload);
    /**
     * 消息处理
     *  <p>
     *      1. 获取消息体中的clientCode 提供用户或设备的编码
     *      2. 发送消息成功或失败信息等操作
     *  </p>
     * @param payload 消息体
     */
    void messageHandler(MqttRocketmqBo payload);
}
